综述
SurfaceControl,顾明思议它是Surface的控制管理者,我们知道Surface是应用层用户进行UI绘制的绘图表面,它由WindowManagerService创建,WindowManagerService管理着窗口对象WindowState,Window是一个抽象的概念,它属于设计层面使用的类,而Surface实际上才是实现上的窗口实体。所以当WMS对Window做了改变,比如调整layerStack,Z-order,大小,位置等后需要通过SurfaceControl来告知SurfaceFlinger,以便SurfaceFlinger更新其在SF端的Layer图层进行合成渲染,这个Layer图层实际上和应用层使用的Surface是对应的。本篇我们将通过SuraceControl来了解这些属性更新的具体过程。
SurfaceControl的创建
1 | public int relayoutWindow(Session session, IWindow client, int seq, |
在之前介绍创建Surface的流程中我们知道SurfaceControl的创建过程是在WMS的relayoutWindow方法中进行的,Surface是从SurfaceControl中取到的。它实际是通过WindowStateAnimator的createSurfaceLocked创建。
1 | SurfaceControl createSurfaceLocked() { |
WindowStateAnimator的createSurfaceLocked负责创建SurfaceControl对象,同时会开启一个事务来提交surface的初始属性。属性的设置是通过SurfaceControl的一系列set方法进行设置的。事务过程通过openTransaction和closeTransaction来控制。
属性设置和事务提交
下面我们就具体分析这两个方法是如何进行属性设置和事务提交的。
1 | public class SurfaceControl { |
这里我们看的是Z-order的属性设置,属性的设置和提交都是通过JNI层进行一步处理的,我们接着看android_view_SurfaceControl.cpp中的JNI实现。
1 |
|
属性设置通过native层的SurfaceControl来设置,提交实际上是经过SurfaceComposerClient处理,之前我们在介绍Surface创建流程是有过介绍,它实际上是SF端的Client在客户端的Binder代理,在WMS中的为应用端创建Session会话时也会构造一个SurfaceSession,这个SurfaceSession实际上就是SurfaceComposerClient在上层的体现。
属性设置
下面我们先看属性是如何设置的
1 | SurfaceControl::SurfaceControl( |
在SurfaceControl中属性设置最终还是通过我们创建的SurfaceComposerClient进行处理的,它的构造方法中的client就是我们在SurfaceSession中创建的
SurfaceComposerClient。
1 |
|
创建SurfaceComposerClient对象时同时会创建一个mComposer的Composer对象,它是一个单例,我们的属性值最终是通过它来进行设置的,我们看看Composer的定义
1 | class Composer : public Singleton<Composer> |
通过Composer的定义我们可以大概看出其实属性的设置和提交最终都是通过它来进行的。我们先看设置的过程
1 | status_t Composer::setLayer(const sp<SurfaceComposerClient>& client, |
setLayer首先通过getLayerStateLocked获取到一个layer_state_t对象,它保存的了layer的属性信息,layer_state_t实际上是由Composer类的mComposerStates维护的,它是一个SortedVector
提交属性事务
接下来就是提交属性的过程,属性提交通过SurfaceComposerClient的openGlobalTransaction和closeGlobalTransaction
实现
1 | void SurfaceComposerClient::openGlobalTransaction() { |
它内部实际上是使用Composer的静态方法实现,而在Compser的类定义中我们看到,这两个静态方法的实现实际上是会使用我们为
SurfaceComposerClient创建的单例mComposer来进行操作。
1 | void Composer::openGlobalTransactionImpl() { |
openGlobalTransactionImpl的实现只是更新事务计数值mTransactionNestCount,真正的提交操作是在closeGlobalTransactionImpl,这里的synchronous默认为false。我们之前设置的属性保存在mComposerStates中,这里将其添加到transaction中,并通过ISurfaceComposer的setTransactionState提交给SF。这里ISurfaceComposer是SurfaceFlinger的Binder 本地代理。
1 | void SurfaceFlinger::setTransactionState( |
在setTransactionState中会通过setClientStateLocked通知SF更新layer的属性。这里会从ComposerState中取出
state,即layer_state_t。设置完成后会通过setTransactionFlags通知SF进行layer属性的变更操作。
1 | uint32_t SurfaceFlinger::setClientStateLocked( |
setClientStateLocked方法首先通过Client的getLayerUser取出Layer图层,这个图层就是我们为应用端创建Surface时在SF端创建的。它通过SF的addClientLayer添加到Client以及SF的mCurrentState.layersSortedByZ中。所以这里将我们设置的属性值最终更新到SF管理的layer中。
设置完SF中layer的属性后需要通知SF进行layer的属性变更,实际上就是让SF进行一次合成渲染操作以便更新应用界面,这个是通过setTransactionFlags进行的。
1 | uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) { |
signalTransaction会通过SF的MessageQueue安排一次VSYNC信号,从而触发INVALIDATE事件,然后在SF中再通过onMessageReceived处理layer属性变更以及合成和渲染的工作。